package org.jiamandan.com.strategy.impl.tram.listener;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jiamandan.com.constant.BizConstant;
import org.jiamandan.com.dto.ZDBasicDto;
import org.jiamandan.com.strategy.impl.tram.IZDListenerService;
import org.jiamandan.com.utils.CommonUtil;
import org.jiamandan.com.utils.RedisUtil;
import org.jiamandan.com.utils.ZDObjectUtil;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;

/**
 * @version Revision 1.0.1
 * @版权：版权所有 (c) 2021
 * @see:
 * @创建日期：2022-12-12 14:00
 * @功能说明： 刷卡操作02指令
//=00正常（无语音），=01未注册（语音“未注册卡”)，=02请绑卡（语音“请再次刷卡”)，=03请解卡（语音“请再次刷卡”)，=04包月用户重复刷卡（语音“请勿重复充电”)，
// =05包月用户已超限制次数（语音“超出限额次数”)，=06余额不足（语音“余额不足”)，=07包月用户已过有效期（语音“已过有效期”)，=08端口故障（语音“端口故障”），
// =09清除余额卡内金额且把联网卡扇区密码改为用户卡（语音“请再次刷卡”），=0A包月用户已超限制时长（语音“超出限额时长”)，
// =0B请勿跨公众号（语音“请勿跨公众号使用”），=0C此设备未注册（语音“此设备未注册”) ，=0D请购买包月（语音“请购买包月”) ，
// =0E跨区充电，余额不足（语音“跨区充电，余额不足”) ，=0F包月设备，无法使用（语音“包月设备，无法使用”) ，
// =10包月设备，跨区无法使用（语音“包月设备，跨区无法使用”) ，=11临时设备，无法使用（语音“临时设备，无法使用”) ，
// =12临时设备，跨区无法使用（语音“临时设备，跨区无法使用”)；/
 * @begin
 * @修改记录:
 * @修改后版本 修改人        修改内容
 * @2022-12-01 16:50	        CWJ       	创建
 * @end
 */
@Service(value = BizConstant.CmdClass.CMD_YD_02_SERVICE)
@AllArgsConstructor
@Slf4j
public class YDPunchTheCardListenerService implements IZDListenerService {

    RedisUtil redisUtil;


    @Override
    public void doExecute(ZDBasicDto dto, Channel client) throws Exception {
        String deviceNo = StrUtil.toString(Integer.parseInt(CommonUtil.reverseHex(dto.getDeviceNo()).substring(2), 16));
        String data = dto.getData();//"0d738dc200010000786d7064"
        log.info("刷卡数据【" + deviceNo + "】(CMD=02)报文:" + JSON.toJSONString(dto));
        long cardNo = Long.parseLong(CommonUtil.reverseHex(StringUtils.substring(data, 0, 8)), 16);
        log.info("刷卡数据【"+StringUtils.substring(data, 0, 8)+"】卡号【" + cardNo + "】(CMD=02)报文:" + JSON.toJSONString(dto));
        String value = StrUtil.toString(System.currentTimeMillis());
        BigDecimal balance = new BigDecimal(10);
        String payload = "";
        payload = "0100" + "00000000" + "ff";
        issue02(payload, cardNo, dto, client);
        String ischarge = StringUtils.substring(data, 10, 12);

        //01未注册（语音“未注册卡”)   未添加卡号或未绑定微信用户
        payload = "0100" + "00000000" + "ff";
        issue02(payload, cardNo, dto, client);

        //01未注册（语音“未注册卡”)   未添加卡号或未绑定微信用户
        payload = "0100" + "00000000" + "ff";
        issue02(payload, cardNo, dto, client);

        //01未注册（语音“未注册卡”)   未添加卡号或未绑定微信用户
        payload = "0100" + "00000000" + "ff";
        issue02(payload, cardNo, dto, client);

        //01未注册（语音“未注册卡”)   未添加卡号或未绑定微信用户
        payload = "0100" + "00000000" + "ff";
        issue02(payload, cardNo, dto, client);

        //卡丢失
        //01未注册（语音“未注册卡”)   未添加卡号或未绑定微信用户
        payload = "0100" + "00000000" + "ff";
        issue02(payload, cardNo, dto, client);

        //01未注册（语音“未注册卡”)   未添加卡号或未绑定微信用户
        payload = "0100" + "00000000" + "ff";
        issue02(payload, cardNo, dto, client);

        payload = "0100" + "00000000" + "ff";
        issue02(payload, cardNo, dto, client);

        //余额16进制    //16进制 左边加0 大小端对换
        String ban16 = Integer.toHexString(balance.multiply(BigDecimal.valueOf(100)).setScale(0, BigDecimal.ROUND_UP).intValue());
        payload = "0000" + CommonUtil.reverseHex(StringUtils.leftPad(ban16, 8, "0")) + "ff";
        issue02(payload, cardNo, dto, client);

        //下发充电
        payload = "0600" + "00000000" + "ff";
        issue02(payload, cardNo, dto, client);
        log.info("刷卡成功创建订单~~~");

    }

    private void issue02(String payload,long cardNo,ZDBasicDto dto,Channel client){
//444e591400c4e1bf04e5010280207769010000000000ffCF06
        payload = StringUtils.rightPad(Long.toHexString(cardNo), 8, "0") + payload;
        String replyMsg = ZDObjectUtil.ydpushMessage(payload, dto, BizConstant.Cmd.CMD_YD_02);
        log.info("应答JMD-YD刷卡查询余额(CMD=02)报文:" +replyMsg);
        ByteBuf buf = Unpooled.buffer(replyMsg.getBytes().length);
        buf.writeBytes(CommonUtil.hexToByteArray(replyMsg));
        ChannelFuture future= client.writeAndFlush(buf);
    }


}
